使用 promise 時可以在 then 方法中放入自訂的處理函式,而預期的錯誤處理是把函式中的錯誤都當作 promise rejection,很直覺的作法就是在呼叫函式時加上 try...catch,有錯時呼叫 reject。
以 onFulfilled 為例,可以寫成這樣:
then(onFulfilled, onRejected) {
    ···
    let fulfilledTask;
    if (typeof onFulfilled === 'function') {
        fulfilledTask = function () {
            try {
                const r = onFulfilled(self.promiseResult);
                returnValue.resolve(r);
            } catch (e) {
                returnValue.reject(e);
            }
        };
    } else {
        fulfilledTask = function () {
            returnValue.resolve(self.promiseResult);
        };
    }
    ···
}
以上 promise 實作差不多告一段落,像一開始所說,這個實作是把 resolve 和 reject 當作方法,如果想要像真正的 promise 一樣把它們做成建構式的 callback 參數,可以參考這段 revealing constructor pattern。
這是書裡附的實作 repo:DemoPromise。另外這段統整了 promise 的一些優點和限制,可以參考。
關於 promise 本身大概寫到這邊,最後還有一點 promise 以外、關於 macrotask 和 microtask 的內容 (雖然這塊很想逃避,但終究還是要寫一下)。